package reviewAlgorithms.search;

import java.util.*;

public class PermuteUnique {
    public static void main(String[] args) {
        int[] nums = {3,1,1,2,2};
        List<List<Integer>> res = permuteUnique(nums);
        for (List<Integer> item: res){
            System.out.println(item);
        }
    }
    public static List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if (nums == null || nums.length < 1){
            return res;
        }
        List<Integer> oneRes = new ArrayList<>();
        getPermuteUnique(nums,oneRes,res);

        return res;
    }

    /**
     * 存在重复的数组全排列，交换时只和后边与自己不同的数交换一次。
     * @param nums
     * @param oneRes
     * @param res
     */
    private static void getPermuteUnique(int[] nums, List<Integer> oneRes, List<List<Integer>> res) {
        if (nums == null || nums.length < 1){
            res.add(new ArrayList<>(oneRes));
            return;
        }
        Set<Integer> changeMemory = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            oneRes.add(nums[i]);

            if (i > 0 && nums[i] != nums[0] && !changeMemory.contains(nums[i])){
                changeMemory.add(nums[i]);
                int temp = nums[0];
                nums[0] = nums[i];
                nums[i] = temp;
                getPermuteUnique(Arrays.copyOfRange(nums, 1,nums.length),oneRes,res);
                temp = nums[0];
                nums[0] = nums[i];
                nums[i] = temp;
            }
            if (i == 0){
                getPermuteUnique(Arrays.copyOfRange(nums, 1,nums.length),oneRes,res);
            }
            oneRes.remove(oneRes.size() - 1);
        }


    }
}
